package Presenter;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.XML;

public abstract class AbstractPresenter<T> {
	public abstract T tryJSONParse(String input);
	public abstract ArrayList<T> tryJSONParseArray(String input);
	public abstract JSONObject createJSON(T item);
	public abstract T createItemFromJSONObject(JSONObject jsonObject);
	public abstract T getEmptyEntity();

	SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZ", Locale.US);
	//SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZZZ", Locale.US);
	
	final String[] formatStrings = {"yyyy-MM-dd'T'HH:mm:ssZZZ", "yyyy-MM-dd'T'HH:mm:ss.SSSZZZ"};
	
	public String getDate(java.util.Date itemDate){
		return (timeFormat.format(itemDate).toString()).substring(0,(timeFormat.format(itemDate).toString()).length() - 2) + ":00";
	}
	
	public Date getDateFromString(final String str){
		for(String formatString : formatStrings){
			try{
				return new SimpleDateFormat(formatString, Locale.US).parse(str);
			} catch (java.text.ParseException e) {
				e.printStackTrace();
			}
		}
		return null;
	}
	
	public boolean isFilled(final String input, final String singleItem, final String multiItem){
		try{
			JSONObject jsonObj = null;
			jsonObj = XML.toJSONObject(input);
			if(!jsonObj.isNull(multiItem)){
				Object itm = jsonObj.get(multiItem);
				if(itm instanceof JSONArray){
					return true;
				} else {
					return false;
				}
			} else {
				return false;
			}
		} catch(JSONException ex){
			ex.printStackTrace();
		}
		return false;
	}
	
	public T doJSONParse(final String input, final String singleItem){
		try{
			JSONObject jsonObj = null;
			jsonObj = XML.toJSONObject(input);
			JSONObject jsonHop = jsonObj.getJSONObject(singleItem);
			T item = createItemFromJSONObject(jsonHop);
			return item;
		} catch(JSONException ex){
			ex.printStackTrace();
		}
		return null;
	}
	
	public ArrayList<T> doJSONParseArray(String input, final String singleItem, final String multiItems){
		ArrayList<T> items = new ArrayList<T>();
		try{
			JSONObject jsonObj = null;
			jsonObj = XML.toJSONObject(input);
			JSONObject jsonAllObjects = jsonObj.getJSONObject(multiItems);
				if(!jsonAllObjects.isNull(singleItem)){
					Object item = jsonAllObjects.get(singleItem);
					if(item instanceof JSONArray){
						JSONArray jArray = (JSONArray)item;
						for(int i=0; i < jArray.length(); i++){
							JSONObject jObject = jArray.getJSONObject(i);
							items.add(createItemFromJSONObject(jObject));
						}
					} else {
						JSONObject jObject = (JSONObject)item;
						items.add(createItemFromJSONObject(jObject));
					}
				}
			if(items.isEmpty()){
				return null;
			}
			return items;
		} catch(JSONException ex){
			ex.printStackTrace();
		}
		return null;
	}
}
